package br.com.iswe.gwt.ui.client.menu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import br.com.iswe.gwt.ui.client.ISWEImageFactory;

import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

public class MenuLateral extends Composite {

	private static final String SUB_ITEM = "subItem";
	private static final String ITEM = "item";
	private static final String ITENS_MENU = "itensMenu";

	//protected CommonImages images = (CommonImages) GWT.create(CommonImages.class);
	
	protected List itens = new ArrayList();
	protected Map indexedItens = new HashMap();
	protected FlexTable table = new FlexTable();
	
	public MenuLateral(){
		initWidget(table);
		table.setStyleName(ITENS_MENU);
	}
	
	public ItemMenu addItem(String texto, String name, ClickListener listener) {
		ItemMenu itemMenu = createItem(texto, name, listener);
		itens.add(itemMenu);
		indexedItens.put(name, itemMenu);
		return itemMenu;
	}
	
	public ItemMenu addItem(String texto, String name) {
		return addItem(texto, name, null);
	}
	
	public ItemMenu addSubItem(ItemMenu pai, String texto, String name) {
		return addSubItem(pai, texto, name, null);
	}
	public ItemMenu addSubItem(ItemMenu pai, String texto, String name, ClickListener listener) {
		if(pai != null){
			ItemMenu filho = createItem(texto, name, listener);
			pai.add(filho);
			//seta o pai no filho
			filho.setPai(pai);
			return filho;
		}
		return null;
	}
	
	public ItemMenu getItemByName(String name){
		return (ItemMenu)indexedItens.get(name);
	}

	private ItemMenu createItem(String texto, String name, ClickListener listener) {
		ItemMenu item = new ItemMenu();
		item.setTexto(texto);
		item.setName(name);
		item.setListener(listener);
		return item;
	}

	public void setupMenu() {
		//varre os itens e cria o menu
		Iterator it = itens.iterator();
		int row = 1;
		while(it.hasNext()){
			ItemMenu item = (ItemMenu)it.next();
			//Cria o link como item do menu.
			Hyperlink link = new Hyperlink(item.getTexto(), item.getName());
			link.addStyleName(ITEM);
			ClickListener listener = item.getListener();
			if( listener != null ){
				link.addClickListener( listener );
			}
			//seta o link dentro do objeto container
			item.setLink(link);

			//adiciona na tabela
			table.setWidget(row++, 0, link);
			item.setRow(row - 1);
			
			item.setTabela(table);
			
			item.setup();
			
			//verifica se possui subitens
			List filhos = item.getFilhos();
			if(filhos != null){
				final FlexTable tbFilhos = new FlexTable();
				//seta a tabela dos filhos dentro do pai.
				item.setTbFilhos(tbFilhos);
				
				link.addClickListener( new ClickListener(){
					public void onClick(Widget sender) {
						//verifica o estado.
						boolean visible = tbFilhos.isVisible();
						tbFilhos.setVisible(!visible);
					}
				} );
				
				int rowFilhos = 0;
				Iterator itFilhos = filhos.iterator();
				while(itFilhos.hasNext()){
					ItemMenu filho = (ItemMenu)itFilhos.next();
					Hyperlink linkFilho = new Hyperlink(filho.getTexto(), filho.getName());
					linkFilho.addStyleName(SUB_ITEM);
					linkFilho.addClickListener(filho.getListener());
					
					//Configura o Container
					filho.setLink(linkFilho);
					filho.setRow(rowFilhos);
					filho.setTabela(tbFilhos);
					
					HorizontalPanel hPanel = new HorizontalPanel();
					hPanel.add(new Label(" "));
					hPanel.add(new Label(" "));
					hPanel.add(new Label(" "));
					Image iconeTopico = ISWEImageFactory.getCommonImageBundle().iconeTopico01().createImage();
					hPanel.add(iconeTopico);
					hPanel.add(new Label(" "));
					hPanel.add(linkFilho);
					tbFilhos.setWidget(rowFilhos++, 0, hPanel);
					
					filho.setup();
				}
				table.setWidget(row++, 0, tbFilhos);
			}
			
			//adiciona a linha de separacao
			Image linhaSeparacao = ISWEImageFactory.getCommonImageBundle().barraHorizontal01().createImage();
			table.setWidget(row++, 0, linhaSeparacao);
		}
		
		
	}

	private static MenuLateral instance = null;
	
	public static MenuLateral getInstance() {
		if(instance == null){
			instance = new MenuLateral();
		}
		return instance;
	}
	
	public static MenuLateral newInstance() {
		instance = new MenuLateral();
		return instance;
	}
	
	
	

}
